package com.smsc.headend.task.engine.dao;

import com.smsc.headend.module.data.dto.TaskDataDTO;
import com.smsc.headend.module.data.dto.TaskPacketDTO;
import com.smsc.headend.module.task.dto.AtomicTask;
import com.smsc.headend.module.task.dto.Task;
import com.smsc.headend.module.task.entity.DeviceTask;
import com.smsc.headend.module.task.dto.AtomicTaskState;

import java.util.List;
import java.util.Set;

public interface TaskDAO {
    /**
     *  AtomicTask Queue
     */
    AtomicTask atomicTaskQueueGet(String taskNo);

    void atomicTaskQueueAdd(AtomicTask atomicTask);

    void atomicTaskQueueAddReverse(AtomicTask atomicTask);

    AtomicTask atomicTaskQueuePopReverse(String taskNo);

    AtomicTask atomicTaskQueuePop(String taskNo);

    void atomicTaskQueueDelete(String taskNo);

    boolean atomicTaskQueueExist(String taskNo);

    /**
     * Task in terminal queue
     */
    void terminalTaskQueueAdd(Task task);

    Task terminalTaskQueueGet(String terminalQueueId);

    Task terminalTaskQueueGetByIndex(String terminalQueueId, Integer index);

    Long getTerminalTaskLength(String terminalId);

    void terminalTaskQueuePop(String terminalQueueId);

    Task getTaskByNo(String taskNo);

    boolean updateTask(Task task);
    /**
     * Atomic Task Executing HashTable
     */
    Set<String> hashGetAtomicTaskStateSet();

    AtomicTaskState hashGetAtomicTaskState(String atomicTaskNo);

    void hashSetAtomicTaskState(String atomicTaskNo, Task task, int sendTimes, AtomicTaskState handlerClass);

    void hashDeleteAtomicTaskState(String atomicTaskNo, Integer priority);


    /**
     * Terminal Set exists task
     * @param termId
     * @param priority
     * @return
     */
    boolean hashSetProcessingTerminalQueue(String termId, Integer priority);

    Integer hashGetProcessingTerminalQueue(String termId);

    List<String> hashKeyProcessingTerminalQueue();

    void hashDelProcessingTerminalQueue(String terminalId);

    AtomicTask getProcessingAtomicTask(String taskNo);

    String getTerminalTaskListKey(Task task);

    String getTerminalTaskListKey(Long terminalId, Integer priority);

    List<TaskDataDTO> getAllTaskData(String taskNo);

    void addTaskData(String taskNo, String atomicTaskNo, String paramName, Object data, Long expireSeconds, Boolean isSuccess);

    List<TaskDataDTO> popAllTaskData(String taskNo);

    void setTaskProcessingAtomicTaskNo(String taskNo, String atomicTaskNo);

    void clearTaskProcessingAtomic(String taskNo);

    String getProcessingAtomicTaskByTaskNo(String taskNo);

    void hashSetRetryTask(Task task);

    List<TaskPacketDTO> popAllTaskPacket(String taskNo);

    List<TaskPacketDTO> popAllTaskPacket(DeviceTask deviceTask);


}
